<?php
/**
 * Created by PhpStorm.
 * User: ytlmi
 * Date: 2017/10/20
 * Time: 8:18
 * 页面内容部分，可在Page/cell/header/footer中使用
 * 可添加文字、段落、表格
 */

namespace org\util\wordtool;


class Content
{
    public $page=null;//整个页面的DOMDocument对象

    public $parentElement=null;//页面body

    protected $doc_pr=null;//段落节点

    protected $font=[];//页面默认字体

    protected $style=[];//页面默认段落样式

    /**
     * @throws \Exception
     * 构造函数
     *
     */
    public function __construct($parentElement,$font=null,$style=null)
    {
        if ($parentElement instanceof \DOMDocument){
            $this->page=$parentElement;//页面DOMDocument对象
        }elseif($parentElement instanceof \DOMNode){
            $this->page=$parentElement->ownerDocument;//页面DOMDocument对象
        }else{
            throw new \Exception('错误的父级元素');
        }
        $this->parentElement=$parentElement;//父节点
        if($font) $this->font=$font;//默认字体
        if($style) $this->style=$style;//默认样式
    }

    /**
     * @param array $font
     * @return object Content
     * 设置默认字体
     */
    public function setFont($font)
    {
        $this->font=$font;
        return $this;
    }

    /**
     * @param array $style
     * @return object Content
     * 设置默认段落样式
     */
    public function setStyle($style)
    {
        $this->style=$style;
        return $this;
    }

    /**
     * @param array $style
     * @return \DOMNode
     * @throws \Exception
     * 添加段落样式Node
     */
    protected function setPrStyle($style)
    {
        $style=$style + $this->style;
        $objStyle=new Style();
        $pPr=$objStyle->createPPR($style);

        return $this->page->importNode($pPr,true);
    }

    /**
     * @param string $text
     * @param array $font
     * @return \DOMNode
     * @throws \Exception
     * 生成带格式文字
     */
    protected function makeText($text,$font=null)
    {
        $objFont=new Font();
        if (!$font) $font=$this->font;
        $font_r=$this->page->importNode($objFont->createRPR($font),true);

        //文本元素
        if (!is_string(strval($text)) && $text!=null) throw new \Exception('错误的文本参数：'.$text);
        $text_r=$this->page->createElement('w:t',$text);
        if (strpos($text," ")) $text_r->setAttribute('xml:space','preserve');//存在空格的情况
        //整合w:r
        $doc_r=$this->page->createElement('w:r');
        $doc_r->appendChild($font_r);
        $doc_r->appendChild($text_r);

        return $doc_r;
    }

    /**
     * @param string $text
     * @param mixed $font
     * @param array $style
     * @return Content
     * @throws \Exception
     * 添加同格式的一段
     */
    public function addPr($text,$font=null,$style=null)
    {
        //检测参数
        if (!$font) $font=$this->font;
        if (!$style) $style=$this->style;
        //生成段落元素
        $pr=$this->page->createElement('w:p');
        $pr->appendChild($this->setPrStyle($style));
        $pr->appendChild($this->makeText($text,$font));
        //记录节点并保存
        $this->doc_pr=$this->parentElement->appendChild($pr);
        return $this;
    }

    /**
     * @param string $text
     * @param mixed $font
     * @param array $style
     * @return Content
     * @throws \Exception
     * 追加文本
     * 如前面有段落，追加文字
     * 否则另起一段写入文字
     */
    public function addText($text,$font=null,$style=null)
    {
        //检测上一个写入的节点是否为w:p
        if ($this->doc_pr instanceof \DOMNode){
            $r=$this->makeText($text,$font);
            $this->doc_pr->appendChild($this->page->importNode($r,true));
        }else{
            $this->addPr($text,$font,$style);
        }
        return $this;
    }

    /**
     * @return Content
     * @throws \Exception
     * 添加换行
     */
    public function addBreak()
    {
        return $this->addPr('');
    }


    /**
     * @param array $tableStyle
     * @return Table
     * 添加表格
     */
    public function addTable($tableStyle=null)
    {
        $t=$this->page->createElement('w:tbl');//生成表格节点
        $tbl=$this->parentElement->appendChild($t);//保存并返回节点位置
        return new Table($tbl,$tableStyle);//创建TABLE对象并告知当前节点
    }

//    /**
//     * @param \DOMNode $table
//     * @return Content
//     * 导入外部生成的表格
//     */
//    public function importTable(\DOMNode $table)
//    {
//        $tbl=$this->page->importNode($table);
//        $this->parentElement->appendChild($tbl);
//        return $this;
//    }


    /**
     * @return string
     * 保存为字符串返回
     */
    public function  saveXML()
    {
        return $this->page->saveXML();
    }

    public function getCurrentDOM()
    {
        return $this->page;
    }

    public function  getElementXml()
    {
        $fullXml=$this->saveXML();
        return str_replace('<?xml version="1.0"?>'."\n",'',$fullXml);
    }

    /**
     * @param string $fileName
     * @return int the number of bytes written or false if an error occurred.
     * 保存到文件
     */
    public function save($fileName)
    {
        return $this->page->save($fileName);
    }

}